home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / gfx / edit / AmiCAD_2.06.lha / AmiCAD / ARexx / TracerSpice.AmiCAD < prev    next >
Text File  |  2000-04-14  |  6KB  |  258 lines

  1. /* Tracé d'un fichier généré par Spice dans la fenêtre AmiCAD courante */
  2. /* Version 1.01: 27 Mai 1999, modification appel MENU */
  3. /* Version 1.02: 4 octobre 1999, ajout affichage point de fonctionnement */
  4. /* Version 1.03: 18 octobre 1999, amélioration affichage point de fonctionnement */
  5. /* Version 1.04: 13 avril 2000, adaptation à la version 2.05 */
  6. /* $VER: 1.04 (© R.Florac, 13/04/00) */
  7.  
  8. options results     /* indispensable pour récupérer le résultat des macros */
  9.  
  10. signal on error     /* pour l'interception des erreurs */
  11. signal on syntax
  12.  
  13. parse arg '"'fichier'"'port
  14.  
  15. if port~="" then address value port
  16.  
  17. if fichier="" then do
  18.     'REQFILE("Fichier Spice","RAM:","*_spice")'
  19.     fichier=result
  20. end
  21. if fichier="" then exit
  22. if ~open(file, fichier, 'R') then do
  23.     'MESSAGE("Fichier de données"+CHR(10)+"'fichier'"+CHR(10)+"non trouvé")'
  24.     return
  25. end
  26.  
  27. titre=readln(file)
  28. if left(titre,6)~="Title:" then do
  29.     'MESSAGE("Fichier de type inconnu"+CHR(10)+"En-tête:"+CHR(10)+"'titre'"):TITLE("")'
  30.     close(file)
  31.     exit
  32. end
  33.  
  34. 'LOCK:TITLE("Lecture des données...")'
  35.  
  36. date=readln(file)
  37. plotname=readln(file)
  38. flags=substr(readln(file),8)
  39. nv=readln(file)
  40. nv=substr(nv,16)
  41. np=readln(file)
  42. np=substr(np,13)
  43. command=readln(file)
  44. v=readln(file)
  45. if v~="Variables:" then do
  46.     'UNLOCK:MESSAGE("Déclaration variables"+CHR(10)+"non trouvée"):TITLE("")'
  47.     close(file)
  48.     exit
  49. end
  50.  
  51. v.0=readln(file)
  52. parse value v.0 with '09'x num '09'x nom '09'x type.0
  53. type_abcisse=type.0
  54. if nom="sweep" then type_analyse="DC"
  55. else if nom="time" then type_analyse="TRANSIENT"
  56. else if nom="frequency" then type_analyse="AC"
  57. else do
  58.     type_analyse="OP"
  59.     nom.0=nom
  60. end
  61.  
  62. if type_analyse~="OP" then do
  63.     'SAVEALL:MODE_TRACÉ=DRAWMODE(1):ROTATE(0,0):SETSCALE(0,100,100)'
  64.     'IF(OBJECTS>0,MARKZONE(0,0,WWIDTH-1,WHEIGHT-1):MENU("Delete"),0)'
  65.     'WRITE("'substr(titre,8)||' ('||substr(plotname,11)')",15,15)'
  66.     'WRITE("Spice 'substr(command,10)||' '||substr(date,7)'",15,25)'
  67. end
  68.  
  69. do i=1 to nv-1
  70.     v.i=readln(file)
  71.     parse value v.i with '09'x num '09'x nom.i '09'x type.i
  72. end
  73. v=readln(file)
  74. if v~="Values:" then do
  75.     'UNLOCK:MESSAGE("Déclaration valeurs"+CHR(10)+"non trouvée")'
  76.     close(file)
  77.     exit
  78. end
  79.  
  80. do i=0 to np-1
  81.     v=readln(file)
  82.     if flags = 'real' then do
  83.     parse var v p '09'x '09'x valeur
  84.     end
  85.     else parse var v p '09'x '09'x valeur ',' imaginaire
  86.     if p~=i then do
  87.     'UNLOCK:MESSAGE("Erreur de lecture"+CHR(10)+"des données"+CHR(10)+"'p'"):TITLE("")'
  88.     close(file)
  89.     exit
  90.     end
  91.     xh.i=valeur
  92.     im.i=imaginaire
  93.     if type_analyse="OP" then yd.0.0=valeur
  94.     do j=1 to nv-1
  95.     v=readln(file)
  96.     if flags='real' then parse var v '09'x p
  97.     else parse var v '09'x p ',' imaginaire
  98.     yd.i.j=p
  99.     im.i.j=imaginaire
  100.     end
  101. end
  102.  
  103. if type_analyse~="OP" then do
  104.     /* recherche des limites des ordonnées (axe vertical) */
  105.     ymin=yd.0.1
  106.     ymax=yd.0.1
  107.     do i=0 to np-1
  108.     do j=1 to nv-1
  109.         if ymin>yd.i.j then ymin=yd.i.j
  110.         if ymax<yd.i.j then ymax=yd.i.j
  111.     end
  112.     end
  113.  
  114.     /* Lecture des dimensions de la fenêtre */
  115.     xgauche=70
  116.     'WWIDTH'
  117.     largeur=result-xgauche-30
  118.     yhaut=40
  119.     'WHEIGHT'
  120.     hauteur=result-yhaut-65
  121.  
  122.     /* Tracé du cadre */
  123.     'TITLE("Tracé des résultats...")'
  124.     call tracer_contour
  125.  
  126.     /* Tracé de la grille */
  127.     lc=largeur%10        /* Lignes verticales */
  128.     xc=xgauche+lc
  129.     do i=1 to 9
  130.     'DRAW('xc','yhaut','xc','yhaut'+'hauteur')'
  131.     xc=xc+lc
  132.     end
  133.  
  134.     yl=hauteur%10        /* Lignes horizontales */
  135.     do i=1 to 9
  136.     'DRAW('xgauche','yhaut+yl*i','xgauche+largeur','yhaut+yl*i')'
  137.     end
  138.  
  139.     /* Tracé des légendes */
  140.     NUMERIC FORM ENGINEERING
  141.     NUMERIC DIGITS 5
  142.     'DRAWMODE(1):ROTATE(0,3)'   /* Axe horizontal */
  143.     xc=xgauche+5
  144.     do i=0 to 10
  145.     rang=(np%10)*i
  146.     if rang>=np then rang=np-1
  147.     t=xh.rang
  148.     'WRITE("'left(t-0,6)'",'xc',WHEIGHT-10)'
  149.     xc=xc+lc
  150.     end
  151.     'WRITE("'type_abcisse'",'xc+15-lc',WHEIGHT-10)'
  152.  
  153.     if ymax-ymin>1 then do    /* Axe vertical */
  154.     ymin=(ymin-1)%1
  155.     ymax=(ymax+1)%1
  156.     end
  157.     'ROTATE(0,0)'
  158.     yl=hauteur%10
  159.     do i=0 to 10
  160.     rang=((ymax-ymin)/10)*i+ymin
  161.     if abs(rang)<0.00001 then rang=0
  162.     'WRITE("'left(rang-0,6,' ')'",'xgauche-50','hauteur-yl*i+yhaut')'
  163.     end
  164.  
  165.     /* Tracé des courbes */
  166.     pas_valeur=1
  167.     pas_x=largeur/np
  168.     do j=1 to nv-1
  169.     i=0
  170.     x0=xgauche
  171.     y0=calcul_ordonnee(yd.0.j)
  172.     if j<4 then 'DRAWMODE('j')'
  173.     else 'DRAWMODE('0-j')'
  174.     do while i<np
  175.         v=yd.i.j
  176.         if result<1 then leave
  177.         'DRAW('x0','y0','xgauche+(pas_x*i)%1','calcul_ordonnee(v)')'
  178.         x0=xgauche+(pas_x*i)%1
  179.         y0=calcul_ordonnee(v)
  180.         i=i+pas_valeur
  181.     end
  182.     'WWIDTH-'length(nom.j)*8'-20'; xn=result
  183.     'DRAW('xn-5','j*10','xn-15','j*10')'
  184.     'DRAWMODE(1):WRITE("'nom.j'",'xn','j*10+5')'
  185.     end
  186.     type_ordonnee=type.1
  187.     do j=1 to nv-1
  188.     if type_ordonnee~=type.j then do
  189.         type_ordonnee=''
  190.         leave
  191.     end
  192.     end
  193.     if type_ordonnee~='' then 'WRITE("'type_ordonnee'",'xgauche-50','yhaut-5')'
  194.     'DRAWMODE(MODE_TRACÉ)'
  195. end
  196. else do
  197.     m='"Point de fonctionnement"'
  198.     do j=0 to nv-1
  199.     NUMERIC FORM ENGINEERING
  200.     /* NUMERIC DIGITS 5 */
  201.     val=yd.0.j-0
  202.     k=j
  203.     if type.k='voltage' then do
  204.         units='V'
  205.         type='Tension'
  206.     end
  207.     else do
  208.         units='A'
  209.         type='Courant'
  210.         val=0-val
  211.     end
  212.     if abs(val) < 1 then do
  213.         val = val * 1000
  214.         if abs(val) < 1 then do
  215.         val = val * 1000
  216.         if abs(val) < 1 then do
  217.             val = val * 1000
  218.             units='n'||units
  219.         end
  220.         else do
  221.             if abs(val) < 1 then do
  222.             val = val * 1000
  223.             units='p'||units
  224.             end
  225.             else units='µ'||units
  226.         end
  227.         end
  228.         else units='m'||units
  229.     end
  230.     m = m||'+CHR(10)+"'||type' 'nom.j||': '||val||' '||units||'"'
  231.     end
  232.     'MESSAGE('m')'
  233. end
  234.  
  235. 'UNLOCK:TITLE("")'
  236. close(file)
  237. exit
  238.  
  239. calcul_ordonnee: procedure expose ymin ymax hauteur yhaut
  240.     parse arg v
  241.     if ymax=ymin then return 0
  242.     return hauteur-((abs(v-ymin)*hauteur/abs(ymax-ymin))%1)+yhaut
  243.  
  244. tracer_contour:
  245.     'SETFILL(0):DRAWMODE(-2):DRAW('xgauche','yhaut','xgauche','yhaut+hauteur'):DRAW('xgauche','yhaut+hauteur','xgauche+largeur','yhaut+hauteur')'
  246.     'DRAW('xgauche+largeur','yhaut+hauteur','xgauche+largeur','yhaut'):DRAW('xgauche+largeur','yhaut','xgauche','yhaut'):DRAWMODE(0)'
  247.     return
  248.  
  249. /* Traitement des erreurs, interruption du programme */
  250. syntax:
  251. erreur=RC
  252. 'MESSAGE("Script TracerSpice"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK'
  253. exit
  254.  
  255. error:
  256. 'MESSAGE("Script TracerSpice"+CHR(10)+"Erreur en ligne 'SIGL'"):UNLOCK'
  257. exit
  258.